package com.company.base;

public class TestDriverF {


    public static void main(String[] args) {

        int n = 45 ;
        //求解第n项的值
        long begin = System.currentTimeMillis();
        System.out.println("斐波那契数列第"+n+"项的值为："+getF(n));
        long end = System.currentTimeMillis();
        System.out.println("运行花费的时间"+((end-begin)/1000));

        System.out.println("------------------非递归实现斐波那契数列--------------------");
        System.out.println(test2(5));

        System.out.println("------------------非递归实现斐波那契数列--------------------");
        int n1 = 5;
        int sum1 = 0;
        int sum2 = 1;
        int sum3 = 0;

        if(n1 < 2) {
            System.out.println("斐波那契数列的第" + n + "项" + "为：" + n1);
        }else {
            for (int i = 2; i <= n1; i++) {
                sum3 = sum1 + sum2;
                sum1 = sum2;
                sum2 = sum3;
            }
            System.out.println("斐波那契数列的第" + n1 + "项" + "为：" + sum3);
        }
    }

    /**
     * 斐波那契数列
     * @param  n 第n项
     *
     */
    public  static  long getF(int n ) {
        //递归的结束条件，当n=1时返回1，结束；或者n=2时返回2；结束
        if (n == 1) {
            return 1;
        }
        if (n == 2) {
            return 2;
        }
        //自己调用自己
        return getF(n-1)+getF(n-2);
    }


    /**
     *  非递归实现斐波那契数列
     */

    public static int test2(int n){
        //x1为第一个月兔子有多少对
        //x2为第二个月兔子有多少对
        int x1=1,x2=2,i=3,count=0;
        for(;i<=n;i++){
            count=x1+x2;    //count赋值为前两个月兔子对数
            x1=x2;          //x1赋值为x2月的兔子对数
            x2=count;       //x2赋值为count月兔子对数
        }

        if(n==1){           //n为第一个月时返回1对
            return x1;
        }
        if(n==2){           //n为第二个月时返回2对
            return x2;
        }

        return count;       //返回目标月兔子对数
    }
}
